<?php
// 包含配置文件
require_once __DIR__ . '/config.php';

/**
 * 将数字转换为密码
 * 使用 Base64 编码作为简单的转换方式
 * 
 * @param string $number 要转换的数字
 * @return string 转换后的密码
 */
function number_to_password($number) {
    // 确保输入是数字
    if (!is_numeric($number)) {
        return false;
    }
    // 使用 Base64 编码转换
    return base64_encode($number);
}

/**
 * 将密码反向编译为数字
 * 
 * @param string $password 要解密的密码
 * @return string|false 解密后的数字，失败返回 false
 */
function password_to_number($password) {
    // 解码 Base64
    $decoded = base64_decode($password, true);
    // 验证解码结果是否为数字
    if ($decoded === false || !is_numeric($decoded)) {
        return false;
    }
    return $decoded;
}

/**
 * 加密内容
 * 使用 AES-256-CBC 加密算法
 * 
 * @param string $content 要加密的内容
 * @return string 加密后的内容
 */
function encrypt_content($content) {
    // 加密密钥
    $key = ENCRYPTION_KEY;
    // 初始化向量
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    // 加密
    $encrypted = openssl_encrypt($content, 'aes-256-cbc', $key, 0, $iv);
    // 组合向量和加密内容
    return base64_encode($iv . '::' . $encrypted);
}

/**
 * 解密内容
 * 
 * @param string $encryptedContent 加密的内容
 * @return string|false 解密后的内容，失败返回 false
 */
function decrypt_content($encryptedContent) {
    // 加密密钥
    $key = ENCRYPTION_KEY;
    // 解码
    $decoded = base64_decode($encryptedContent, true);
    if ($decoded === false) {
        return false;
    }
    // 分离向量和加密内容
    $parts = explode('::', $decoded, 2);
    if (count($parts) !== 2) {
        return false;
    }
    $iv = $parts[0];
    $encrypted = $parts[1];
    // 解密
    return openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
}

/**
 * 检查管理员是否已登录
 * 
 * @return bool 已登录返回 true，否则返回 false
 */
function is_admin_logged_in() {
    // 启动会话
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
    // 检查登录状态
    return isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true;
}

/**
 * 检查管理员密码是否正确
 * 
 * @param string $password 要检查的密码
 * @return bool 正确返回 true，否则返回 false
 */
function check_admin_password($password) {
    // 检查密码文件是否存在
    if (!file_exists(ADMIN_PASSWORD_FILE)) {
        return false;
    }
    // 读取存储的密码哈希
    $stored_hash = file_get_contents(ADMIN_PASSWORD_FILE);
    if ($stored_hash === false) {
        return false;
    }
    // 去除可能的换行符
    $stored_hash = trim($stored_hash);
    // 验证密码
    return password_verify($password, $stored_hash);
}

/**
 * 更新管理员密码
 * 
 * @param string $new_password 新密码
 * @return bool 成功返回 true，失败返回 false
 */
function update_admin_password($new_password) {
    // 生成密码哈希
    $hash = password_hash($new_password, PASSWORD_DEFAULT);
    // 写入密码文件
    return file_put_contents(ADMIN_PASSWORD_FILE, $hash) !== false;
}

/**
 * 管理员登录
 * 
 * @param string $password 管理员密码
 * @return bool 登录成功返回 true，否则返回 false
 */
function admin_login($password) {
    if (check_admin_password($password)) {
        // 启动会话
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }
        // 设置登录状态
        $_SESSION['admin_logged_in'] = true;
        return true;
    }
    return false;
}

/**
 * 根据数字号码获取信件内容
 * 
 * @param string $number 数字号码
 * @return string|false 信件内容，不存在返回 false
 */
function get_letter_by_number($number) {
    // 确保输入是数字
    if (!is_numeric($number)) {
        return false;
    }
    // 文件路径
    $filePath = LETTERS_DIRECTORY . $number . '.txt';
    // 检查文件是否存在
    if (!file_exists($filePath)) {
        return false;
    }
    // 读取加密内容
    $encryptedContent = file_get_contents($filePath);
    // 解密内容
    return decrypt_content($encryptedContent);
}

/**
 * 添加新信件
 * 
 * @param string $number 数字号码
 * @param string $content 信件内容
 * @return bool 成功返回 true，失败返回 false
 */
function add_letter($number, $content) {
    // 确保输入是数字
    if (!is_numeric($number)) {
        return false;
    }
    // 文件路径
    $filePath = LETTERS_DIRECTORY . $number . '.txt';
    // 加密内容
    $encryptedContent = encrypt_content($content);
    // 写入文件
    return file_put_contents($filePath, $encryptedContent) !== false;
}

/**
 * 获取所有信件列表
 * 
 * @return array 信件列表
 */
function get_all_letters() {
    $letters = array();
    $dir = LETTERS_DIRECTORY;
    // 打开目录
    $dh = opendir($dir);
    if ($dh) {
        // 读取目录内容
        while (($file = readdir($dh)) !== false) {
            // 跳过特殊文件
            if ($file === '.' || $file === '..') {
                continue;
            }
            // 检查文件是否为 .txt 文件
            if (pathinfo($file, PATHINFO_EXTENSION) === 'txt') {
                // 获取数字号码
                $number = pathinfo($file, PATHINFO_FILENAME);
                // 读取并解密内容
                $content = get_letter_by_number($number);
                // 添加到列表
                $letters[] = array(
                    'number' => $number,
                    'content' => $content,
                    'created_at' => date('Y-m-d H:i:s', filectime($dir . $file)),
                    'updated_at' => date('Y-m-d H:i:s', filemtime($dir . $file))
                );
            }
        }
        closedir($dh);
        // 按修改时间排序
        usort($letters, function($a, $b) {
            return strtotime($b['updated_at']) - strtotime($a['updated_at']);
        });
    }
    return $letters;
}

/**
 * 更新信件
 * 
 * @param string $number 数字号码
 * @param string $content 新的信件内容
 * @return bool 成功返回 true，失败返回 false
 */
function update_letter($number, $content) {
    // 先删除旧信件
    if (!delete_letter($number)) {
        return false;
    }
    // 再添加新信件
    return add_letter($number, $content);
}

/**
 * 删除信件
 * 
 * @param string $number 数字号码
 * @return bool 成功返回 true，失败返回 false
 */
function delete_letter($number) {
    // 确保输入是数字
    if (!is_numeric($number)) {
        return false;
    }
    // 文件路径
    $filePath = LETTERS_DIRECTORY . $number . '.txt';
    // 检查文件是否存在
    if (!file_exists($filePath)) {
        return false;
    }
    // 删除文件
    return unlink($filePath);
}
?>